< Mac OS X ÇÃÉIÅ[ÉvÉìÉtÉ@ÉCÉãêîÇÃêßå¿

Technical Q&A QA1005
Open File Limits on Mac OS X


Q: Mac OS X ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ìØéûÇ…äJÇ≠DZÇΔÇÃÇ≈Ç´ÇÈÉtÉ@ÉCÉãÇÃç≈ëÂêîÇÕÇ¢Ç≠ǬÇ≈Ç∑Ç©ÅH

A: Mac OS XÇ≈ÇÕÅAÉfÉtÉHÉãÉgÇÃê›íËÇ≈ÅAìØéûÇ…äJÇ≠DZÇΔÇÃÇ≈Ç´ÇÈÉtÉ@ÉCÉãÇÃç≈ëÂêîÇÕÉvÉçÉZÉXÇ≤ÇΔÇ… 256 Ç…êßå¿Ç≥ÇÍǃǢNjÇ∑ÅBǵǩǵÅAé¿ç€Ç…ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ìØéûÇ…äJÇ≠DZÇΔÇÃÇ≈Ç´ÇÈÉtÉ@ÉCÉãêîÇÕDZÇÃêßå¿ÇÊÇËLJè≠Ç»Ç≠Ç»ÇËÇ‹Ç∑ÅBǬNjÇËÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ìØéûÇ…äJÇ≠DZÇΔÇÃÇ≈Ç´ÇÈé¿ç€ÇÃÉtÉ@ÉCÉãêîÇÕÅAǪÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™égópÇ∑ÇÈÉTÅ[ÉrÉXÇ…ÇÊǡǃäJÇ©ÇÍÇÈÉtÉ@ÉCÉãÇÃêîÇæÇØè≠Ç»Ç≠Ç»ÇÈÇΔǢǧDZÇΔÇ≈Ç∑ÅBÇΩÇΔǶnjÅAstdin ǻǫÇÃàÍïîÇÃÉtÉ@ÉCÉãÇÕÅAÉVÉXÉeÉÄÇ…ÇÊǡǃé©ìÆìIÇ…äJÇ©ÇÍÇ‹Ç∑ÅBÇ‹ÇΩÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™åƒÇ—èoÇ∑ÉtÉåÅ[ÉÄÉèÅ[ÉNÇ…ÇÊǡǃÅAǪÇÃëºÇÃÉtÉ@ÉCÉãÇ™äJÇ©ÇÍÇÈDZÇΔLJdžÇËÇ‹Ç∑ÅB

ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ 256 Çí¥Ç¶ÇÈÉtÉ@ÉCÉãÇäJÇ≠ïKóvǙdžÇÈèÍçáÇÕÅAÅuÉäÉXÉg 1.ÅvÇ…é¶Ç∑ÇÊǧǻ setrlimit System ÉtÉåÅ[ÉÄÉèÅ[ÉNåƒÇ—èoǵÇégǡǃÅADZÇÃêßå¿ílÇà¯Ç´è„Ç∞ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB



íçà”:
setrlimit ÇÕ System ÉtÉåÅ[ÉÄÉèÅ[ÉNåƒÇ—èoǵÇ≈Ç∑ÅBǵÇΩǙǡǃÅACFM ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅADZÇÃÉãÅ[É`ÉìÇåƒÇ—èoÇ∑ÇΩÇflÇ…ÅACFBundle API ÇégópÇ∑ÇÈïKóvÇÕdžÇËÇ‹ÇπÇÒÅB



setrlimit ÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™äJÇ≠DZÇΔÇÃÇ≈Ç´ÇÈÉtÉ@ÉCÉãÇÃç≈ëÂêîÇëùâ¡Ç≥ÇπÇÈDZÇΔÇÕÇ≈Ç´Ç‹Ç∑Ç™ÅADZÇÃílDžLJǢÇ≠ǬǩÇÃé¿ç€ìIÇ»êßå¿Ç™Ç†ÇËÇ‹Ç∑ÅBÉfÉtÉHÉãÉgÇ≈ÅAÉIÅ[ÉvÉìÉtÉ@ÉCÉãÇÃëçêîÇ…ÇÕÉOÉçÅ[ÉoÉãÇ»êßå¿Ç™Ç†ÇËÅAǪÇÃílÇÕ 12288 Ç…ê›íËÇ≥ÇÍǃǢNjÇ∑ÅBÇ‹ÇΩÅAàÍà”ÇÃÉIÅ[ÉvÉìÉtÉ@ÉCÉãÇÕÅAǪÇÍǺÇÍâºëzÉtÉ@ÉCÉãÉVÉXÉeÉÄÉCÉìÉ^ÉtÉFÅ[ÉX (Virtual-Filesystem Interface) ÉåÉCÉÑÅ[ì‡Çà vnode Çè¡îÔǵNjÇ∑ÅBégópâ¬î\Ç» vnode ÇÃêîÇÕÅAÉCÉìÉXÉgÅ[ÉãÇ≥ÇÍǃǢÇÈ RAM ÇÃóeó Ç…ÇÊǡǃïœâªÇµÇ‹Ç∑ (128M ÉVÉXÉeÉÄÇÃèÍçáÅAÇŸÇ⁄ 2864 Çà vnode ÇégópÇ≈Ç´Ç‹Ç∑)ÅBí èÌÇÃÉVÉXÉeÉÄëÄçÏÇçsǧèÍçáÅAÉVÉXÉeÉÄÇ™ä«óùÇ≈Ç´ÇÈÉIÅ[ÉvÉìÉtÉ@ÉCÉãÇÃêîÇÕ 300 Ç©ÇÁ 400 ÇÃä‘Ç…Ç»ÇËÇ‹Ç∑ÅB



#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/time.h>#include <sys/resource.h>#include <sys/errno.h>

int SetMaximumFiles(long filecount) {
    struct rlimit lim;
    lim.rlim_cur = lim.rlim_max = (rlim_t)filecount;
    if ( setrlimit(RLIMIT_NOFILE, &lim) == 0 )
        return 0; 
    else return errno;
}

int GetMaximumFiles(long *filecount) {
    struct rlimit lim;
    if ( getrlimit(RLIMIT_NOFILE, &lim) == 0 ) {
        *filecount = (long)lim.rlim_max;
        return 0; 
    } else return errno;
}


int main (int argc, const char * argv[])
{
    long filecount;
    int err;
    
    printf("SetMaximumFiles(800)=%d\n", SetMaximumFiles(800)); 
    
    err = GetMaximumFiles(&filecount);
    
    printf("GetMaximumFiles(&filecount)=%d\n", err); 
    if (err == 0) printf("  -> filecount = %ld\n", filecount);

    return 0;
}

/* DZÇÃÉvÉçÉOÉâÉÄÇ©ÇÁÇÃèoóÕÅF

SetMaximumFiles(800)=0
GetMaximumFiles(&filecount)=0
  -> filecount = 800

ÉXÉeÅ[É^ÉX 0 Ç≈èIóπÅB
*/

ÉäÉXÉg 1. ÉIÅ[ÉvÉìÉtÉ@ÉCÉãêîÇÃêßå¿Çí≤êÆÇ∑ÇÈÉTÉìÉvÉãÉvÉçÉOÉâÉÄ



êÊêiìIÇ»ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAsysctl ÉãÅ[É`ÉìÇégǡǃÅAé¿çséûÇÃÉOÉçÅ[ÉoÉãÇ»ÉIÅ[ÉvÉìÉtÉ@ÉCÉãêîÇÃêßå¿ÇΔÉOÉçÅ[ÉoÉãÇ» vnode ÇÃäÑìñó ÇÉIÅ[ÉoÅ[ÉâÉCÉhÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBÇΩÇæÇµÅADZÇÃëÄçÏÇ…ÇÕ root ÇÃÉAÉNÉZÉXå†Ç™ïKóvÇ≈džÇÈÇΩÇflÅAÉTÅ[ÉoÇ‚êÍñÂâΔÇ…ÇÊǡǃä«óùÇ≥ÇÍÇÈǪÇÃëºÇÃÉRÉìÉsÉÖÅ[É^Çç\ê¨Ç∑ÇÈñ⁄ìIÇ≈ÇÃÇ›égópǵǃÇ≠ÇæÇ≥Ç¢ÅB



èdóv:
àÍî ìIÇ»ÉfÉXÉNÉgÉbÉvÉVÉXÉeÉÄÇ≈ÇÃégópÇñ⁄ìIÇΔÇ∑ÇÈÉVÉXÉeÉÄÇ≈ÇÕÅAé¿çséûÇÃÉIÅ[ÉvÉìÉtÉ@ÉCÉãêîÇÃêßå¿Ç‚ÉOÉçÅ[ÉoÉãÇ» vnode ÇÃäÑìñó Çí≤êÆÇµÇ»Ç¢Ç≈Ç≠ÇæÇ≥Ç¢ÅBì¡Ç…ÅAvnode ÇÃêîÇdžNjÇËDžLJëÂÇ´Ç≠ǵÇ∑ǨÇÈÇΔÅAó\ëzÇ≈ǴǻǢñ‚ëËÇ™î≠ê∂Ç∑ÇÈâ¬î\ê´Ç™Ç†ÇËÇ‹Ç∑ÅB




[2001 îN 2 åé 8 ì˙]